#ifndef _ECBM_TIMER_H_//头文件防止重加载必备，先看看有没有定义过这个，定义说明已经加载过一次了。
#define _ECBM_TIMER_H_//没定义说明是首次加载，那么往下执行。并且定义这个宏定义，防止下一次被加载。
/*-------------------------------------------------------------------------------------
The MIT License (MIT)

Copyright (c) 2021 奈特

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

免责说明：
    本软件库以MIT开源协议免费向大众提供。作者只保证原始版本是由作者在维护修BUG，
其他通过网络传播的版本也许被二次修改过，由此出现的BUG与作者无关。而当您使用原始
版本出现BUG时，请联系作者解决。
                            **************************
                            * 联系方式：进群778916610 *
                            **************************
------------------------------------------------------------------------------------*/
//-----------------以下是图形设置界面，可在Configuration Wizard界面设置-----------------
//<<< Use Configuration Wizard in Context Menu >>>
//<e>定时器0使能与设置
//<i>勾选该选项会使能定时器0，开放和定时器0相关的操作函数。若未使用定时器0，可以关掉优化空间。
#define ECBM_TIMER0_EN 1
//<o.3>定时器开关
//<0=>软件开关 <1=>软硬件开关。
//<i>当选择“软件开关”时，运行timer_start函数就能启动定时器0。
//<i>当选择“软硬件开关”时，除了运行timer_start函数外，INT0（P32）脚要为高电平才启动定时器0。通常会用在通过外部硬件来启动定时器的情况。
//<o.2>计数来源
//<0=>对系统时钟计数（定时器应用）
//<1=>对外部T0（P34）脚的脉冲信号计数（计数器应用）
//<i>timer的本质就是计数器。对系统时钟计数时，由于时钟的周期T固定，计数值n可以从寄存器读出，那么就能通过t=nT算出时间。这样就能用作定时器。
//<i>因此如果外部脉冲信号也有固定不变的周期，那么也可以用外部脉冲信号来做定时器。不过一般外部信号都是随机的，没有固定周期，我们只能知道计数值n，所以就成了计数器。
//<o.0..1>中断模式
//<i>勾选之后，定时器0的中断将不可被“ET0=0;”屏蔽。
//<0=>普通模式
//<3=>不可屏蔽中断模式 
#define ECBM_TIMER0_TMOD 0x00
//<o.7>时钟分频
//<i>就相当于STC-ISP工具里的12T模式和1T模式。
//<0=>系统时钟12分频（Fosc/12） <1=>系统时钟不分频
#define ECBM_TIMER0_AUXR 0x80
//<o.0>对外输出时钟
//<i>勾选该选项后，每次定时器0发生溢出时，T0CLKO（P35）脚的电平自动发生翻转。
#define ECBM_TIMER0_INTCLKO 0x00
//<o>定时时间/计数数量
//<0-65535>
//<i>在这里填入脉冲数（在定时模式下，脉冲数=定时时间/时间基准。在计数模式下，就是你想计数的最大值）。
//<i>比如定时模式下，主频24MHz的时间基准是1/24000000秒，定时100us的脉冲数就是0.0001/(1/24000000)=2400。那么输入2400就行了。
//<i>时间基准计算比较麻烦，做定时器应用时可以直接调用timer_set_timer_mode函数。
//<i>如果是在计数模式下，希望统计到100个脉冲就触发中断，那么输入100就行了。
#define ECBM_TIMER0_COUNT 10
//<q>定时器0的中断使能
#define ECBM_TIMER0_IT_EN 1
//</e>
//<e>定时器1使能与设置
//<i>勾选该选项会使能定时器1，开放和定时器1相关的操作函数。若未使用定时器1，可以关掉优化空间。
#define ECBM_TIMER1_EN 0
//<o.7>定时器开关
//<0=>软件开关 <1=>软硬件开关。
//<i>当选择“软件开关”时，运行timer_start函数就能启动定时器1。
//<i>当选择“软硬件开关”时，除了运行timer_start函数外，INT1（P33）脚要为高电平才启动定时器1。通常会用在通过外部硬件来启动定时器的情况。
//<o.6>计数来源
//<0=>对系统时钟计数（定时器应用）
//<1=>对外部T1（P35）脚的脉冲信号计数（计数器应用）
//<i>timer的本质就是计数器。对系统时钟计数时，由于时钟的周期T固定，计数值n可以从寄存器读出，那么就能通过t=nT算出时间。这样就能用作定时器。
//<i>因此如果外部脉冲信号也有固定不变的周期，那么也可以用外部脉冲信号来做定时器。不过一般外部信号都是随机的，没有固定周期，我们只能知道计数值n，所以就成了计数器。
#define ECBM_TIMER1_TMOD 0x00
//<o.6>时钟分频
//<i>就相当于STC-ISP工具里的12T模式和1T模式。
//<0=>系统时钟12分频（Fosc/12） <1=>系统时钟不分频
#define ECBM_TIMER1_AUXR 0x40
//<o.1>对外输出时钟
//<i>勾选该选项后，每次定时器1发生溢出时，T1CLKO（P34）脚的电平自动发生翻转。
#define ECBM_TIMER1_INTCLKO 0x00
//<o>定时时间/计数数量
//<0-65535>
//<i>在这里填入脉冲数（在定时模式下，脉冲数=定时时间/时间基准。在计数模式下，就是你想计数的最大值）。
//<i>比如定时模式下，主频24MHz的时间基准是1/24000000秒，定时100us的脉冲数就是0.0001/(1/24000000)=2400。那么输入2400就行了。
//<i>时间基准计算比较麻烦，做定时器应用时可以直接调用timer_set_timer_mode函数。
//<i>如果是在计数模式下，希望统计到100个脉冲就触发中断，那么输入100就行了。
#define ECBM_TIMER1_COUNT 65535
//<q>定时器1的中断使能
#define ECBM_TIMER1_IT_EN 0
//</e>
//<e>定时器2使能与设置
//<i>勾选该选项会使能定时器2，开放和定时器2相关的操作函数。若未使用定时器2，可以关掉优化空间。
#define ECBM_TIMER2_EN 0
//<o.3>计数来源
//<0=>对系统时钟计数（定时器应用）
//<1=>对外部T2（P12）脚的脉冲信号计数（计数器应用）
//<i>timer的本质就是计数器。对系统时钟计数时，由于时钟的周期T固定，计数值n可以从寄存器读出，那么就能通过t=nT算出时间。这样就能用作定时器。
//<i>因此如果外部脉冲信号也有固定不变的周期，那么也可以用外部脉冲信号来做定时器。不过一般外部信号都是随机的，没有固定周期，我们只能知道计数值n，所以就成了计数器。
//<o.2>时钟分频
//<i>就相当于STC-ISP工具里的12T模式和1T模式。
//<0=>系统时钟12分频（Fosc/12） <1=>系统时钟不分频
#define ECBM_TIMER2_AUXR 0x04
//<o.2>对外输出时钟
//<i>勾选该选项后，每次定时器2发生溢出时，T2CLKO（P13）脚的电平自动发生翻转。
#define ECBM_TIMER2_INTCLKO 0x00
//<o>定时时间/计数数量
//<0-65535>
//<i>在这里填入脉冲数（在定时模式下，脉冲数=定时时间/时间基准。在计数模式下，就是你想计数的最大值）。
//<i>比如定时模式下，主频24MHz的时间基准是1/24000000秒，定时100us的脉冲数就是0.0001/(1/24000000)=2400。那么输入2400就行了。
//<i>时间基准计算比较麻烦，做定时器应用时可以直接调用timer_set_timer_mode函数。
//<i>如果是在计数模式下，希望统计到100个脉冲就触发中断，那么输入100就行了。
#define ECBM_TIMER2_COUNT 500
//<q>定时器2的中断使能
//<i>注意：定时器2的中断函数里需要清除中断标志位。
#define ECBM_TIMER2_IT_EN 0
//</e>
//<e>定时器3使能与设置
//<i>勾选该选项会使能定时器3，开放和定时器3相关的操作函数。若未使用定时器3，可以关掉优化空间。
#define ECBM_TIMER3_EN 0
//<o.2>计数来源
//<0=>对系统时钟计数（定时器应用）
//<1=>对外部T3（P04）脚的脉冲信号计数（计数器应用）
//<i>timer的本质就是计数器。对系统时钟计数时，由于时钟的周期T固定，计数值n可以从寄存器读出，那么就能通过t=nT算出时间。这样就能用作定时器。
//<i>因此如果外部脉冲信号也有固定不变的周期，那么也可以用外部脉冲信号来做定时器。不过一般外部信号都是随机的，没有固定周期，我们只能知道计数值n，所以就成了计数器。
//<o.1>时钟分频
//<i>就相当于STC-ISP工具里的12T模式和1T模式。
//<0=>系统时钟12分频（Fosc/12） <1=>系统时钟不分频
//<o.0>对外输出时钟
//<i>勾选该选项后，每次定时器3发生溢出时，T3CLKO（P05）脚的电平自动发生翻转。
#define ECBM_TIMER3_T4T3M 0x00
//<o>定时时间/计数数量
//<0-65535>
//<i>在这里填入脉冲数（在定时模式下，脉冲数=定时时间/时间基准。在计数模式下，就是你想计数的最大值）。
//<i>比如定时模式下，主频24MHz的时间基准是1/24000000秒，定时100us的脉冲数就是0.0001/(1/24000000)=2400。那么输入2400就行了。
//<i>时间基准计算比较麻烦，做定时器应用时可以直接调用timer_set_timer_mode函数。
//<i>如果是在计数模式下，希望统计到100个脉冲就触发中断，那么输入100就行了。
#define ECBM_TIMER3_COUNT 65535
//<q>定时器3的中断使能
//<i>注意：定时器3的中断函数里需要清除中断标志位。
#define ECBM_TIMER3_IT_EN 0
//</e>
//<e>定时器4使能与设置
//<i>勾选该选项会使能定时器4，开放和定时器4相关的操作函数。若未使用定时器4，可以关掉优化空间。
#define ECBM_TIMER4_EN 0
//<o.6>计数来源
//<0=>对系统时钟计数（定时器应用）
//<1=>对外部T4（P06）脚的脉冲信号计数（计数器应用）
//<i>timer的本质就是计数器。对系统时钟计数时，由于时钟的周期T固定，计数值n可以从寄存器读出，那么就能通过t=nT算出时间。这样就能用作定时器。
//<i>因此如果外部脉冲信号也有固定不变的周期，那么也可以用外部脉冲信号来做定时器。不过一般外部信号都是随机的，没有固定周期，我们只能知道计数值n，所以就成了计数器。
//<o.5>时钟分频
//<i>就相当于STC-ISP工具里的12T模式和1T模式。
//<0=>系统时钟12分频（Fosc/12） <1=>系统时钟不分频
//<o.4>对外输出时钟
//<i>勾选该选项后，每次定时器4发生溢出时，T4CLKO（P07）脚的电平自动发生翻转。
#define ECBM_TIMER4_T4T3M 0x00
//<o>定时时间/计数数量
//<0-65535>
//<i>在这里填入脉冲数（在定时模式下，脉冲数=定时时间/时间基准。在计数模式下，就是你想计数的最大值）。
//<i>比如定时模式下，主频24MHz的时间基准是1/24000000秒，定时100us的脉冲数就是0.0001/(1/24000000)=2400。那么输入2400就行了。
//<i>时间基准计算比较麻烦，做定时器应用时可以直接调用timer_set_timer_mode函数。
//<i>如果是在计数模式下，希望统计到100个脉冲就触发中断，那么输入100就行了。
#define ECBM_TIMER4_COUNT 10000
//<q>定时器4的中断使能
//<i>注意：定时器4的中断函数里需要清除中断标志位。
#define ECBM_TIMER4_IT_EN 0
//</e>
//<<< end of configuration section >>>
//-----------------以下是图形设置界面，可在Configuration Wizard界面设置-----------------
/*---------------------------------------头文件------------------------------------*/
#include "ecbm_core.h"    //ECBM库的头文件，里面已经包含了STC8的头文件。
/*--------------------------------------程序定义-----------------------------------*/
/*-------------------------------------------------------
函数名：timer_start
描  述：定时器开始函数。用于打开一个定时器。
输  入：
    id      需要打开的定时器编号
输  出：无
返回值：无
创建者：奈特
调用例程：无
创建日期：2021-9-15
修改记录：
-------------------------------------------------------*/
extern void timer_start(u8 id);
/*-------------------------------------------------------
函数名：timer_stop
描  述：定时器停止函数。用于关闭一个定时器。
输  入：
    id      需要关闭的定时器编号
输  出：无
返回值：无
创建者：奈特
调用例程：无
创建日期：2019-12-16
修改记录：
-------------------------------------------------------*/
extern void timer_stop(u8 id);
/*-------------------------------------------------------
函数名：timer_out
描  述：定时器输出控制函数。用于控制一个定时器的时钟输出功能。
输  入：
    id      要控制的定时器编号。
    en      1代表开启时钟输出，0代表关闭时钟输出。
输  出：无
返回值：无
创建者：奈特
调用例程：无
创建日期：2021-9-15
修改记录：
-------------------------------------------------------*/
extern void timer_out(u8 id,u8 en);
/*-------------------------------------------------------
函数名：timer_init
描  述：定时器初始化函数。
输  入：无
输  出：无
返回值：无
创建者：奈特
调用例程：无
创建日期：2021-9-15
修改记录：
-------------------------------------------------------*/
extern void timer_init(void);
/*-------------------------------------------------------
函数名：timer_set_timer_mode
描  述：定时器设定定时模式函数。可将指定的定时器设定成指定的时间中断。
输  入：
    id      要设定的定时器号
    us      要设定的时间，单位us。太长的时间可以在中断里延长。
输  出：无
返回值：无
创建者：奈特
调用例程：无
创建日期：2021-9-15
修改记录：
-------------------------------------------------------*/
extern void timer_set_timer_mode(u8 id,u16 us);
/*-------------------------------------------------------
函数名：timer_set_value
描  述：定时器设定初值函数。可向指定的定时器装填定时初值，推荐先停止定时器再写。
输  入：
    id      要设定的定时器号
    value   要设定的初值
输  出：无
返回值：无
创建者：奈特
调用例程：无
创建日期：2021-9-15
修改记录：
-------------------------------------------------------*/
extern void timer_set_value(u8 id,u16 value);
/*-------------------------------------------------------
函数名：timer_get_value
描  述：定时器计数值获取函数。可读出指定的定时器当前的计数值，推荐先停止定时器再读。
输  入：
    id      要设定的定时器号
    us      要设定的时间，单位us。太长的时间可以在中断里延长。
输  出：无
返回值：无
创建者：奈特
调用例程：无
创建日期：2021-9-15
修改记录：
-------------------------------------------------------*/
extern u16 timer_get_value(u8 id);
#endif  //和最上面的#ifndef配合成一个程序段。
        //以一个空行为结尾。